#include <iostream>
#include <vector>

using namespace std;

// 指针变量 - 保存另外一个变量位置的变量
int a = 11;
int *pa = &a;

// 自定义类型 - 模拟现实中存在，但是 C++ 中不存在的事物
class XXXX {};

// Tree
class Node {
public:
  int value;
  Node *left;
  Node *right;

  // constructor
  Node(int v, Node *l, Node *r): value(v), left(l), right(r) {
    cout << "A node with value" << v << "is created.";
  }

  bool isLeaf() {
    if (left == nullptr && right == nullptr) {
      return true;
    }
    else {
      return false;
    }
  }
};

class BinaryTree {
public:
  Node root; // 树根

  // constructor
  // 成员初始化列表
  BinaryTree(Node r): root(r) {
    cout << "A tree is created." << endl;
  }

  // 先序遍历
  // 先遍历当前节点，遍历左边，遍历右边
  void preorderTraverse() {
    preorderTraverse(root);
  }

  void preorderTraverse(Node n) {
    cout << n.value << " ";

    if (n.isLeaf()) { return; }
    preorderTraverse(*n.left);
    preorderTraverse(*n.right);
  }
};

int main(int argc, char const *argv[])
{

  Node four {4, nullptr, nullptr};
  Node five {5, nullptr, nullptr};
  Node two {2, &four, &five};
  Node three {3, nullptr, nullptr};
  Node one {1, &two, &three};

  BinaryTree tree{one};
  tree.preorderTraverse();


  return 0;
}
